'''
Created on 03/09/2013

@author: daniel
'''
import unittest
import colecciones.arbolGeneral
import colecciones.nodoGeneral#para el tesCase

class FuncionesDeArbolGeneral(colecciones.arbolGeneral.ArbolGeneral):
    
    def altura(self):
        if(self.getHijos().esVacia()):return 0
        i=0
        maxH=0
        while (i<self.getHijos().getTamanio()):
            cont=self.getHijos().elemento(i).altura()
            if(cont>maxH):maxH=cont
            i+=1
        return maxH+1
    
    def nivel(self, dato):
        if((self.getDatoRaiz()==dato)|(self.getHijos().esVacia())):return 0
        i=0
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).getDatoRaiz()==dato):
                return 1
            nivel=self.getHijos().elemento(i).nivel(dato)
            i+=1
            if(nivel!=0):return nivel+1
        return 0
  
    def ancho(self):
        if(self.getDatoRaiz()==None):return 0
        if(self.getHijos()==None):return 1
        i=0
        maxAn=self.getHijos().getTamanio()
        while (i<self.getHijos().getTamanio()):
            cont=self.getHijos().elemento(i).ancho()
            if(cont>maxAn):maxAn=cont
            cont=0
            i+=1
        return maxAn
    
    def esAncestro(self,datoPadre,datoHijo):
        rama=self.__esFamilia(datoPadre)
        resul=rama.__esFamilia(datoHijo)
        if(resul==None):return False
        return True
    
    def __esFamilia(self,dato):#devuelve la rama del dato
        if(self.getDatoRaiz()==dato):return self
        i=0
        if(self.getHijos()==None):return None
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).__esFamilia(dato)!=None):return self.getHijos().elemento(i)
            i+=1
        return None
        
    

class Test(unittest.TestCase):

    def testAltura(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        #print obj.altura()
        self.assertEquals(obj.altura(),3, "Verifica funcion altura")
        
    def testNivel(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(5))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        self.assertEquals(obj.nivel(4),0, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(3),1, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(2),2, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(5),2, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(1),3, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(100),0, "Verifica funcion nivel para inexistente")
        
    def testAncho(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3A"))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3B"))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        self.assertEquals(obj.ancho(),3, "Verifica funcion ancho")
        
    def testEsAncestro(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3A"))
            )
        self.assertFalse(obj.esAncestro(3,"3A"), "Verifica hermandad")
        self.assertTrue(obj.esAncestro(4,3), "verifica padrazgo")       

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()